package com.kotlin

/**
 * 数据类的使用
 *  1，数据类默认情况下没有无参的构造方法
 *  2，默认情况下是final类
 *  3，可以使用 noarg 和 allopen 插件 => 生成无参的构造方法和不带final的类（在编译器的时候会生成，在代码中是无法直接使用无参构造方法的，但是使用反射可以）
 *  4，在JVM中如果生成的类需要一个无参数的构造函数，那么所有的属性都必须要指定默认值
 *  5，在数据类定义的额外属性，即不是在构造方法中定义的属性，那么不会自动加入到toString() equals() 或 hashCode() 等方法中
 * @author huan.fu
 * @date 2019-03-10 - 20:41
 */

data class Country(val id: Int, val name: String) {
    /**
     * 此时在类体中生成了一个额外的属性，那个这个额外的属性不会自动加入到 toString() equals() hashCode() 等方法中
     */
    var area: String? = null
}

class ComponentX {
    operator fun component1(): String {
        return "我"
    }

    operator fun component2(): String = "是"

    operator fun component3(): Int = 110
}

fun main() {
    val china = Country(1, "中国")
    // 调用的 componentN 方法
    val (id, name) = china
    println(china)
    println("id = $id and name = $name")
    val (name1, name2, phone) = ComponentX()
    println("name1=$name1 and name2=$name2 phone=$phone")
}